/**
 * cache_helper.js
 * 缓存助手模块 - PLM项目专用
 */

// 尝试加载项目helper
let helper;
try {
  helper = require('./helper.js');
  console.log('成功加载项目helper');
} catch (e) {
  console.error('加载项目helper失败，使用简易实现', e);
  // 简易helper实现
  helper = {
    isDefined: (val) => val !== undefined && val !== null,
    isEmpty: (val) => val === undefined || val === null || val === ''
  };
}

// 尝试导入全局缓存助手 - 使用直接路径
let globalCacheHelper;
try {
  globalCacheHelper = require('../../../../helpers/cache_helper.js');
  console.log('成功加载全局cache_helper');
} catch (e) {
  console.warn('加载全局cache_helper失败，使用本地实现', e);
  globalCacheHelper = null;
}

// 本地实现
const localImpl = {
  // 内存缓存
  _cachePool: {},
  
  /**
   * 设置缓存
   * @param {string} key - 缓存键
   * @param {*} value - 缓存值
   * @param {number} time - 缓存时间(秒)
   */
  set: function(key, value, time = 3600) {
    if (!key) return;
    
    const expireTime = time > 0 ? (new Date().getTime() + time * 1000) : 0;
    
    // 存入内存
    this._cachePool[key] = {
      value: value,
      expireTime: expireTime
    };
    
    // 同时存入小程序存储
    try {
      wx.setStorageSync(key, {
        value: value,
        expireTime: expireTime
      });
    } catch (e) {
      console.error('缓存写入失败:', e);
    }
  },
  
  /**
   * 获取缓存
   * @param {string} key - 缓存键
   * @returns {*} 缓存值，过期或不存在返回null
   */
  get: function(key) {
    if (!key) return null;
    
    // 优先从内存获取
    let res = this._cachePool[key];
    const now = new Date().getTime();
    
    // 内存中存在且未过期
    if (res && (res.expireTime === 0 || now <= res.expireTime)) {
      return res.value;
    }
    
    // 内存中不存在或已过期，从存储中获取
    try {
      res = wx.getStorageSync(key);
      if (res && (res.expireTime === 0 || now <= res.expireTime)) {
        // 有效缓存，更新内存缓存
        this._cachePool[key] = res;
        return res.value;
      }
      
      // 已过期，删除缓存
      if (res) {
        this.remove(key);
      }
      
      return null;
    } catch (e) {
      console.error('读取缓存失败:', e);
      return null;
    }
  },
  
  /**
   * 删除缓存
   * @param {string} key - 缓存键
   */
  remove: function(key) {
    if (!key) return;
    
    // 删除内存缓存
    if (this._cachePool[key]) {
      delete this._cachePool[key];
    }
    
    // 删除存储缓存
    try {
      wx.removeStorageSync(key);
    } catch (e) {
      console.error('删除缓存失败:', e);
    }
  },
  
  /**
   * 清空所有缓存
   */
  clear: function() {
    // 清空内存缓存
    this._cachePool = {};
    
    // 清空存储缓存
    try {
      wx.clearStorageSync();
    } catch (e) {
      console.error('清空缓存失败:', e);
    }
  }
};

// 使用全局实现或本地实现
const cacheHelper = globalCacheHelper || localImpl;

// 导出模块
module.exports = cacheHelper;
